﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Excel = Microsoft.Office.Interop.Excel;
using System.Windows.Forms;

namespace Dijkstra_Belman_Ford
{
    class GraphSimulationInfo
    {
        public long czas;
        public int liczbaKrawedzi;
        public int liczbaWierzcholkow;

        public GraphSimulationInfo() { }

        public GraphSimulationInfo(long czas, int liczbaKrawedzi, int liczbaWierzcholkow)
        {
            this.czas = czas;
            this.liczbaKrawedzi = liczbaKrawedzi;
            this.liczbaWierzcholkow = liczbaWierzcholkow;
        }

        public static void ArrayToExcel(GraphSimulationInfo[] Dijkstra, GraphSimulationInfo[] BellmanFord, string fileName)
        {
            Excel.Application xlApp;
            Excel.Workbook wb;
            otworzPlikExcela(out wb, fileName, out xlApp);

            xlApp.Workbooks.Add();
            Excel.Workbook wbe = xlApp.Workbooks.get_Item(1);
            Excel.Worksheet ws = xlApp.Worksheets.get_Item(1);

            int RowCount = Dijkstra.Length * 4;
            object[,] daneDoWstawienia = new Object[RowCount + 1, 2];

            daneDoWstawienia[0,0]="Dijkstra";
            daneDoWstawienia[0,1]="Bellman-Ford";
            for (int i = 1; i < RowCount; i += 4)
            {
                //Dijkstra
                daneDoWstawienia[i, 0] = Dijkstra[i / 4].czas;
                daneDoWstawienia[i + 1, 0] = Dijkstra[i / 4].liczbaKrawedzi;
                daneDoWstawienia[i + 2, 0] = Dijkstra[i / 4].liczbaWierzcholkow;
                daneDoWstawienia[i + 3, 0] = "";
                //Bellman-Ford
                daneDoWstawienia[i, 1] = Dijkstra[i / 4].czas;
                daneDoWstawienia[i + 1, 1] = Dijkstra[i / 4].liczbaKrawedzi;
                daneDoWstawienia[i + 2, 1] = Dijkstra[i / 4].liczbaWierzcholkow;
                daneDoWstawienia[i + 3, 1] = "";
            }

            Excel.Range adres = ws.get_Range("A1");

            adres = adres.get_Resize(RowCount, 2);
            adres.Value = daneDoWstawienia;

            wbe.SaveAs(fileName); 
            wbe.Close();
            xlApp.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
            MessageBox.Show("Pomyślnie wyeksportowano dane do pliku:\n" + fileName, "Formularz", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private static bool otworzPlikExcela(out Excel.Workbook wb, string plik, out Excel.Application xlApp)
        {
            try
            {
                xlApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
            }
            catch (Exception ex)
            {
                xlApp = new Microsoft.Office.Interop.Excel.Application();
            }

            wb = null;

            if (plik != null)
            {
                try
                {                    
                    wb = xlApp.Workbooks.Open(plik);
                }
                catch (Exception ex)
                {
                    try
                    {
                        wb = (Excel.Workbook)System.Runtime.InteropServices.Marshal.BindToMoniker(plik);
                    }
                    catch (Exception exl)
                    {
                        return false;
                    }
                }
            }

            return true;
        }
    }
}
